package org.xx.armory.bindings;

import java.lang.annotation.Annotation;

import static org.xx.armory.commons.Validators.notNull;

/**
 * 表示某个方法参数的所有绑定注解。
 *
 * @author Haart
 */
public final class ParamAnnotation {
    private final String name;
    private final boolean text;

    /**
     * 构造{@code ParamAnnotations}对象。
     *
     * @param p
     *         方法参数注解。
     */
    private ParamAnnotation(Param p) {
        notNull(p, "p");
        this.name = p.value().trim();
        this.text = p.text();
    }

    /**
     * 通过参数注解数组构造{@code ParamAnnotations}对象。
     *
     * @param annotations
     *         参数注解数组。
     * @return 已构造的{@code ParamAnnotations}对象
     * @throws NullPointerException
     *         如果参数{@code annotations}是{@code null}。
     */
    public static ParamAnnotation of(Annotation[] annotations) {
        notNull(annotations, "annotations");

        for (final Annotation annotation : annotations) {
            if (annotation instanceof Param) {
                return new ParamAnnotation((Param) annotation);
            }
        }

        return null;
    }

    /**
     * 获取参数的绑定名称。
     *
     * @return 参数的绑定名称。
     */
    public final String getName() {
        return this.name;
    }

    /**
     * 判断该参数是否是绑定参数。
     *
     * @return 该参数是否是绑定参数。
     */
    public final boolean isBindable() {
        return !this.name.isEmpty();
    }

    /**
     * 判断该参数是否是文本类型的参数。
     *
     * @return 该参数是否是文本类型的参数。
     */
    public final boolean isText() {
        return this.text;
    }
}
